; /*
;       FreeRTOS.org V4.4.0 - Copyright (C) 2003-2007 Richard Barry.
;
;       This file is part of the FreeRTOS distribution.
;
;       FreeRTOS is free software; you can redistribute it and/or modify
;       it under the terms of the GNU General Public License as published by
;       the Free Software Foundation; either version 2 of the License, or
;       (at your option) any later version.
;
;       FreeRTOS is distributed in the hope that it will be useful,
;       but WITHOUT ANY WARRANTY; without even the implied warranty of
;       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;       GNU General Public License for more details.
;
;       You should have received a copy of the GNU General Public License
;       along with FreeRTOS; if not, write to the Free Software
;       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
;
;       A special exception to the GPL can be applied should you wish to distribute
;       a combined work that includes FreeRTOS, without being obliged to provide
;       the source code for any proprietary components.  See the licensing section
;       of http://www.FreeRTOS.org for full details of how and when the exception
;       can be applied.
;
;       ***************************************************************************
;       See http://www.FreeRTOS.org for documentation, latest information, license
;       and contact details.  Please ensure to read the configuration and relevant
;       port sections of the online documentation.
;
;       Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along
;       with commercial development and support options.
;       ***************************************************************************
; */

        .include  "arm.inc"

	.text
	.code 32
	.align  0

        .extern  vTaskSwitchContext

        .globl  vPortYieldProcessor
        .globl  vPortStartFirstTask

        .include "ISR_Support.inc"

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// Starting the first task is just a matter of restoring the context that
// was created by pxPortInitialiseStack().
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vPortStartFirstTask:
        portRESTORE_CONTEXT

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// Manual context switch function.  This is the SWI hander.
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vPortYieldProcessor:
        ADD             LR, LR, #4              // Add 4 to the LR to make the LR appear exactly
                                                // as if the context was saved during and IRQ
                                                // handler.

        portSAVE_CONTEXT                        // Save the context of the current task...
        LDR R0, =vTaskSwitchContext             // before selecting the next task to execute.
        MOV     lr, pc
        BX R0
        portRESTORE_CONTEXT                     // Restore the context of the selected task.

        nop
        nop


vPortYieldProcessorFromIsr:
        //now SVC mode
        MSR     CPSR_c, #Mode_SVC|I_Bit
        portRESTORE_CONTEXT

        

